package day0331;

import javax.swing.*;
import java.util.ArrayList;

public class Yang5 {
    public static void main(String[] args) {
        //1.用JFrame类创建一个窗口win
        JFrame win=new JFrame();//组件1-窗口(相框)

        //3.用JPanel类创建一个面板pane
        JPanel pane=new JPanel();//组件2-面板(相框后的木板)

        //4.设置面板属性，并给面板中添加组件(标签<标签中包含背景图>)
        pane.setLayout(null);//4.1.用面板pane调用JPanel中的setLayout(null)取消默认的排版方式(从左到右排版从上到下排版的)
        //没有排版方式后只能用坐标和宽高来定位组件，这样可以让背景图和按钮叠加显示(举例：将背景图设置到0，0坐标处(宽480，高800)，
        //将按钮设置到10，10)

        JLabel jla=new JLabel(new ImageIcon("img/背景.jpg"));//4.2.组件3和组件4-标签中包含一个背景图(塑封纸里包含一个照片)
        jla.setSize(480,800);//4.4、用jla变量调用JLabel中的setLocation()设置标签的宽高(背景图ImageIcon也会采用这个宽高)
        jla.setLocation(0,0);//4.3、用jla变量调用JLabel中的setLocation()设置标签的坐标(背景图ImageIcon也会采用这个坐标)
        pane.add(jla);//4.5、将标签放到面板中(将塑封好的照片放到木板上, 木板最后要放到相框中)

        //6.调用本类中的createButtons()方法获取144个按钮(此方法会创建144个按钮放在一个ArrayList集合中返回)
        ArrayList<JButton> buttons=createButtons();
        //将按钮放到面板Pane中(写在"放入背景图代码"的下边)
        //先放图片到面板中，  再放按钮到面板中(按这样的顺序才能将按钮放到图片上边)
        putBtnsToPane(buttons,pane,49,0,7,30,100);//将144个按钮buttons放到面板pane中
        putBtnsToPane(buttons,pane,36,49,6,60,130);//将144个按钮buttons放到面板pane中
        putBtnsToPane(buttons,pane,35,85,7,30,160);//将144个按钮buttons放到面板pane中
        putBtnsToPane(buttons,pane,24,120,6,60,190);//将144个按钮buttons放到面板pane中
        //调用allCover()判断buttons中的144个按钮，哪个按钮被覆盖了，就将它设置为不可用   按钮.setEnabled(false)
        allCover(buttons);
        addClickAction(buttons, pane);//调用一个addClickAction()方法给144个按钮添加点击事件
        //将buttons中存的144个按钮都传到addClickAction()方法中(给144个按钮都添加点击的代码)

        //5.将面板放到窗口中(将放了照片的木板放到相框后边)
        win.add(pane);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用win变量调用JFrame的setDefaultCloseOperation()方法设置窗口能关闭

        //2.设置窗口的属性(大小、居中、能被关闭、禁用修改大小、设置窗口显示)
        win.setSize(480,800);//用win变量调用JFrame的setSize()方法设置窗口宽高
        win.setLocationRelativeTo(null);//用win变量调用JFrame的setLocationRelativeTo()方法设置窗口居中
        win.setResizable(false);//用win变量调用JFrame的setResizable()方法设置窗口不能修改大小
        win.setVisible(true);//用win变量调用JFrame的setVisible()方法设置窗口显示
    }

    //4.
    private static void addClickAction(ArrayList<JButton> buttons, JPanel pane) {
        //创建blowBtns集合，用来表示底下7个空间(可以存储7个按钮)
        ArrayList<JButton> blowBtns=new ArrayList<>();

        for (int i = 0; i < buttons.size(); i++) {
            JButton btn = buttons.get(i);
            //给btn按钮用addActionListener()设置点击按钮执行的代码
            btn.addActionListener(e -> {
                System.out.println("点我了");
                //1.将点击的按钮从buttons集合中删除(从144个按钮中把它删除)
                JButton clickBtn=(JButton) e.getSource();//用e.getSource()获取被点击的按钮
                buttons.remove(clickBtn);//用集合buttons的remove()把它从buttons集合中删除
                //2.把点击的按钮clickBtn，添加到blowBtns集合中。
                blowBtns.add(clickBtn);
                //3.用for循环修改blowsBtns集合中每个按钮的位置(因为上边还要写消除3个相同按钮的代码)
                for (int j = 0; j < blowBtns.size(); j++) {
                    JButton blowB=  blowBtns.get(j);//用blowBtns集合的get(元素序号)， 取出底下七个空间中的一个按钮
                    blowB.setLocation(20+ j*64,     640);//用setLocation()方法修改此按钮的位置
                }
                allCover(buttons); //重新实现压牌
                clickBtn.removeActionListener(clickBtn.getActionListeners()[0]); //删除卡牌点击事件(不要求掌握)
            });
        }
    }



    /**
     * 6.定义一个createButtons方法，创建144个按钮放到一个ArrayList集合中返回。
     * @return ArrayLsit<JButton>  btns;    (存储了144个按钮的ArrayList集合)
     */
    public static ArrayList<JButton> createButtons(){
        //6.1、用一个ArrayList来存储144个按钮比数组更方便(存元素的代码都写好了，只需要调用).
        ArrayList<JButton> btns=new ArrayList<JButton>();//定义一个ArrayList，存储144个按钮
        //6.2、用for循环创建144个按钮放到btns集合中(16个按钮用9遍)
        String[] names = {"刷子","剪刀","南瓜","奶瓶","干草", //names数组存储16个图片的名字。
                "手套","树桩","兔子","毛线","水桶",
                "树", "苹果","白菜", "草", "萝卜","铃铛"};
        for (int i = 0; i < 9; i++) {//将16个图片名使用了9次  (总共创建了16*9个图片对象)
            for (int j = 0; j < names.length; j++) {
                String imgName=names[j];//6.2.1、从names数组中获取图片名
                //6.2.2、用imgName和"img"以及".jpg"拼接路径来创建一个图片对象放入到 创建的 JButton中(此按钮会放入到btns集合中)
                JButton b=new JButton(new ImageIcon("img/" +imgName +".png"));//6.2.2.创建按钮
                b.setName(imgName);//给按钮设置一个名字
                b.setDisabledIcon(new ImageIcon("img/"+imgName+"2.png")); //给按钮设置不可用状态的图片
                btns.add(b);//6.2.3、将创建的按钮添加到btns集合中
            }
        }
        //6.3、返回btns集合(集合中存储了144个按钮)
        return btns;
    }




    //1.buttons集合中的144个按钮，放到面板pange中。
    //2.count表示这一层放多少个按钮(putBtnsToPane()执行一次就放一层按钮)。
    //3.offset表示这一层的第一个按钮是这144个按钮中的第几个。
    //4.cols表示这一层按钮有几列。
    //5.int x和int y 表示这一层第一个按钮的左上角坐标.
    //从buttons集合中取出每个按钮，放到pane面板上
    //用for循环从buttons集合中取出一个按钮，放到pane面板上
    private static void putBtnsToPane(ArrayList<JButton> buttons, JPanel pane,
                                      int count, int offset, int cols, int x, int y) {
        //1.定义for循环执行144次
        for (int i = 0; i < count; i++) {
            JButton b=buttons.get(i+offset);// 1.1.循环中从buttons集合中用buttons.get(i)取出一个按钮
            b.setSize(59,66);// 1.2.调用按钮b的setSize(59,66)方法设置宽高
            b.setLocation(x+i%cols*59,y+i/cols*60);//  调用按钮b的setLocation(59,66)方法设置坐标
            //System.out.println(b.getX());
            //b.setLocation(x+i%7*59,y+i/7*60);//  调用按钮b的setLocation(59,66)方法设置坐标
            //30+i%cols*59,100+i/cols*60
            pane.add(b,0);// 1.3.给面板pane中中添加按钮b
        }//pane.add(b,0)中的0表示：   按钮b处于面板pane的第0层(最顶层)
    }

    /**
     * 用来判断144个按钮中，哪个按钮被覆盖了(如果此按钮被覆盖就将其设置为不可用)
     * @param buttons buttons集合存储了144个按钮
     */
    public static void allCover(ArrayList<JButton> buttons) {
        for (int i = 0; i < buttons.size(); i++) {
            JButton bottomBtn = buttons.get(i);//从144个按钮中取出一个按钮
            for (int j = i+1;  j<buttons.size(); j++) {
                JButton topBtn = buttons.get(j);
                int x=topBtn.getX();//上边按钮的x坐标
                int y=topBtn.getY();//上边按钮的y坐标
                //如果上边按钮的x坐标>底下按钮的x坐标-按钮的宽度  && 上边按钮的x坐标<=底下按钮的x坐标+按钮的宽度&&
                //并且上边按钮的y坐标>底下按钮的y坐标-按钮的高度  && 上边按钮的y坐标<=底下按钮的y坐标+按钮的高度
                boolean isCover=//上边按钮的坐标是否符合这四个条件
                        (x>bottomBtn.getX()-59 && y>bottomBtn.getY()-60&&
                                x<bottomBtn.getX()+59 && y<bottomBtn.getY()+60);
                if(isCover==true){
                    bottomBtn.setEnabled(false);//如果bottomBtn被覆盖，就将bottomBtn设置为不可用
                    break;//如果有一个按钮覆盖了bottomBtn，就不用再判断它是否被覆盖，就用break结束判断的过程 。
                }else{
                    bottomBtn.setEnabled(true);
                }

            }
        }
    }




    /*public static void allCover(ArrayList<JButton> buttons) {
        for (int i = 0; i < buttons.size(); i++) {
            JButton bottomBtn = buttons.get(i);
            for (int j = i+1; j < buttons.size(); j++) {
                JButton topBtn = buttons.get(j);
                int x=topBtn.getX();
                int y=topBtn.getY();
                boolean isCover=
                        (x>bottomBtn.getX()-59 && x<bottomBtn.getX()+59&&
                                y>bottomBtn.getY()-60 && y<bottomBtn.getY()+60);
                //System.out.println(bottomBtn.getX());
                //System.out.println((x>bottomBtn.getX()-59)+","+(x+">"+(bottomBtn.getX()-59)));
                //System.out.println((x<bottomBtn.getX()+59)+","+(x+"<"+(bottomBtn.getX()+59)));
                if(isCover==true){
                    bottomBtn.setEnabled(false);
                    break;
                }else{

                    bottomBtn.setEnabled(true);
                }
            }
        }
    }*/



}

